package com.linwen.excise.od;


import java.util.Arrays;
import java.util.Scanner;

/**
 * 你有 n 台机器编号为 1~n，每台都需要完成完成一项工作，机器经过配置后都能完成独立完成一项工作。
 * 假设第 i 台机器你需要花 B 分钟进行设置，然后开始运行，J 分钟后完成任务。
 * 现在，你需要选择布置工作的顺序，使得用最短的时间完成所有工作。
 * 注意，不能同时对两台进行配置，但配置完成的机器们可以同时执行他们各自的工作。
 * 输入描述：
 * <p>
 * 第一行输入代表总共有 M 组任务数据（1<M<=10）。
 * 每组数第一行为一个整数指定机器的数量 N（0<N<=1000）。
 * 随后的 N 行每行两个整数，第一个表示 B（0<=B<=10000），第二个表示 J（0<=J<=10000）。
 * 每组数据连续输入，不会用空行分隔。各组任务单独计时。
 * 输出描述：
 * <p>
 * 对于每组任务，输出最短完成时间，且每组的结果独占一行。例如，两组任务就应该有两行输出。
 * 示例1  输入输出示例仅供调试，后台判题数据一般不包含示例
 * <p>
 * 输入
 * <p>
 * 1
 * <p>
 * 1
 * <p>
 * 2 2
 * <p>
 * 输出
 * <p>
 * 4
 * <p>
 * 解释：
 * <p>
 * 第一行1为一组任务，第二行1代表只有一台机器，第三行表示该机器配置需2分钟，执行需2分钟。
 * <p>
 * 示例2  输入输出示例仅供调试，后台判题数据一般不包含示例
 */
public class _高效的任务规划 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int m = scanner.nextInt();
        for (int i = 0; i < m; i++) {
            int n = scanner.nextInt();
            int[][] ints = new int[n][2];
            // 让任务工作时间最长的机器先运行
            int total_time = 0;
            //保存配置时间和运行时间
            for (int i1 = 0; i1 < ints.length; i1++) {
                ints[i][0] = scanner.nextInt();
                ints[i][1] = scanner.nextInt();
            }
            // 排序
            Arrays.sort(ints, (e1, e2) -> (e2[1] - e1[1]));
            // 但是在机器运行时间的时候去配置机器是最赚的，这样配置的时间都可以省去，所以工作时间长的越早跑越好。
            for (int j = 0; j < n; j++) {
                int time  = total_time + ints[j][0] + ints[j][1];
                total_time += ints[j][0];
                total_time = Math.max(total_time, time);
            }
            System.out.println(total_time);
        }
    }
}
